package com.aseo.model.entity.hibernate;

import java.io.Serializable;

import java.util.Date;
import java.util.Set;

import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.validation.constraints.NotNull;

import org.hibernate.validator.constraints.NotEmpty;

@Entity(name = "com.aseo.model.entity.hibernate.Reclamo")
@Table(name = "reclamos.reclamo")
public class Reclamo implements Serializable {
	
    private static final long serialVersionUID = 1L;
    
	@SequenceGenerator(name = "reclamos.reclamo_reclamo_id_seq", sequenceName = "reclamos.reclamo_reclamo_id_seq")
    @GeneratedValue(generator = "reclamos.reclamo_reclamo_id_seq")
    @Id
    @Basic(optional = false)
    @Column(name = "reclamo_id")
    private Long reclamoId;
	
    @Column(name = "codigo")
    private String codigo;
    
    @JoinColumn(name = "reclamo_id_padre", referencedColumnName = "reclamo_id")
    @ManyToOne(fetch = FetchType.EAGER)
    private Reclamo reclamoIdPadre;
    
    @OneToMany(mappedBy = "reclamoIdPadre", cascade = CascadeType.ALL, fetch = FetchType.EAGER )
    private Set<Reclamo> reclamoHijosCollection;

    @NotNull(message="Es necesaria la fecha del reclamo")
    @Basic(optional = false)
    @Column(name = "fecha_reclamo")
    @Temporal(TemporalType.TIMESTAMP)
    private Date fechaReclamo;
    
    @Column(name = "longitud")
    private String longitud;
    
    @Column(name = "latitud")
    private String latitud;
    
    @NotEmpty(message="Es necesaria la descripcion del caso")
    @Basic(optional = false)
    @Column(name = "descripcion_caso")
    private String descripcionCaso;
    
    @Column(name = "observaciones")
    private String observaciones;
    
    @Column(name = "forma_resolucion")
    private String formaResolucion;
    
    @NotNull(message="Es necesaria la fecha de registro")
    @Basic(optional = false)
    @Column(name = "fecha_registro")
    @Temporal(TemporalType.TIMESTAMP)
    private Date fechaRegistro;
    
    @NotNull(message="Es necesaria la fecha de actualizacion")
    @Basic(optional = false)
    @Column(name = "fecha_actualizacion")
    @Temporal(TemporalType.TIMESTAMP)
    private Date fechaActualizacion;
    
    @Basic(optional = false)
    @Column(name = "estado")
    private int estado;
    
    @NotNull(message="Es necesaria la direccion del reclamo")
    @JoinColumn(name = "domicilio_id", referencedColumnName = "domicilio_id")
    @ManyToOne(optional = false, cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private Domicilio domicilioId;
    
    @NotNull(message="Es necesario el punto de recoleccion")
    @JoinColumn(name = "punto_id", referencedColumnName = "punto_id")
    @ManyToOne(fetch = FetchType.EAGER)
    private PuntoRecoleccion puntoRecoleccionId;
    
    @NotNull(message="Es necesario el reclamador")
    @JoinColumn(name = "reclamador_id", referencedColumnName = "reclamador_id")
    @ManyToOne(optional = false, cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private Reclamador reclamadorId;
    
    @NotNull(message="Es necesario el tipo de origen del reclamo")
    @JoinColumn(name = "tipo_medio_origen_id", referencedColumnName = "tipo_medio_origen_id")
    @ManyToOne(optional = false, fetch = FetchType.EAGER)
    private TipoMedioOrigen tipoMedioOrigenId;
    
    @NotNull(message="Es necesario el tipo de reclamo")
    @JoinColumn(name = "tipo_reclamo_id", referencedColumnName = "tipo_reclamo_id")
    @ManyToOne(optional = false, fetch = FetchType.EAGER)
    private TipoReclamo tipoReclamoId;
    
    @OneToMany( fetch = FetchType.EAGER, mappedBy = "reclamoId")
    private Set<Accion> accionCollection;
    
    @OneToMany( fetch = FetchType.EAGER, mappedBy = "reclamoId")
    private Set<Nota> notaCollection;
    
    public Reclamo() {
    }

    public Reclamo(Long reclamoId) {
        this.reclamoId = reclamoId;
    }

    public Long getReclamoId() {
        return reclamoId;
    }

    public void setReclamoId(Long reclamoId) {
        this.reclamoId = reclamoId;
    }

    public Reclamo getReclamoIdPadre() {
        return reclamoIdPadre;
    }

    public void setReclamoIdPadre(Reclamo reclamoIdPadre) {
        this.reclamoIdPadre = reclamoIdPadre;
    }

    public Date getFechaReclamo() {
        return fechaReclamo;
    }

    public void setFechaReclamo(Date fechaReclamo) {
        this.fechaReclamo = fechaReclamo;
    }

    public String getLongitud() {
        return longitud;
    }

    public void setLongitud(String longitud) {
        this.longitud = longitud;
    }

    public String getLatitud() {
        return latitud;
    }

    public void setLatitud(String latitud) {
        this.latitud = latitud;
    }

    public String getDescripcionCaso() {
        return descripcionCaso;
    }

    public void setDescripcionCaso(String descripcionCaso) {
        this.descripcionCaso = descripcionCaso;
    }

    public String getObservaciones() {
        return observaciones;
    }

    public void setObservaciones(String observaciones) {
        this.observaciones = observaciones;
    }

    public String getFormaResolucion() {
        return formaResolucion;
    }

    public void setFormaResolucion(String formaResolucion) {
        this.formaResolucion = formaResolucion;
    }

    public Date getFechaRegistro() {
        return fechaRegistro;
    }

    public void setFechaRegistro(Date fechaRegistro) {
        this.fechaRegistro = fechaRegistro;
    }

    public Date getFechaActualizacion() {
        return fechaActualizacion;
    }

    public void setFechaActualizacion(Date fechaActualizacion) {
        this.fechaActualizacion = fechaActualizacion;
    }

    public int getEstado() {
        return estado;
    }

    public void setEstado(int estado) {
        this.estado = estado;
    }

    public Domicilio getDomicilioId() {
        return domicilioId;
    }

    public void setDomicilioId(Domicilio domicilioId) {
        this.domicilioId = domicilioId;
    }

    public PuntoRecoleccion getPuntoRecoleccionId() {
        return puntoRecoleccionId;
    }

    public void setPuntoRecoleccionId(PuntoRecoleccion puntoRecoleccionId) {
        this.puntoRecoleccionId = puntoRecoleccionId;
    }

    public Reclamador getReclamadorId() {
        return reclamadorId;
    }

    public void setReclamadorId(Reclamador reclamadorId) {
        this.reclamadorId = reclamadorId;
    }

    public TipoMedioOrigen getTipoMedioOrigenId() {
        return tipoMedioOrigenId;
    }

    public void setTipoMedioOrigenId(TipoMedioOrigen tipoMedioOrigenId) {
        this.tipoMedioOrigenId = tipoMedioOrigenId;
    }

    public TipoReclamo getTipoReclamoId() {
        return tipoReclamoId;
    }

    public void setTipoReclamoId(TipoReclamo tipoReclamoId) {
        this.tipoReclamoId = tipoReclamoId;
    }
    
    public String getCodigo() {
        return codigo;
    }

    public void setCodigo(String codigo) {
        this.codigo = codigo;
    }

    public Set<Reclamo> getReclamoHijosCollection() {
		return reclamoHijosCollection;
    }
    
    public void setReclamoHijosCollection(Set<Reclamo> reclamoHijosCollection) {
		this.reclamoHijosCollection = reclamoHijosCollection;
	}
    
    public Set<Accion> getAccionCollection() {
		return accionCollection;
	}

	public void setAccionCollection(Set<Accion> accionCollection) {
		this.accionCollection = accionCollection;
	}
	
	public Set<Nota> getNotaCollection() {
		return notaCollection;
	}

	public void setNotaCollection(Set<Nota> notaCollection) {
		this.notaCollection = notaCollection;
	}

	@Override
    public int hashCode() {
        int hash = 0;
        hash += (reclamoId != null ? reclamoId.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {

    	if (!(object instanceof Reclamo)) return false;

    	Reclamo other = (Reclamo) object;
        if ((this.reclamoId == null && other.reclamoId != null) 
         || (this.reclamoId != null && !this.reclamoId.equals(other.reclamoId))) return false;

        return true;
    }

    @Override
    public String toString() {
        return "com.aseo.model.entity.hibernate.Reclamo[reclamoId=" + reclamoId + "]";
    }

}
